package week_3.experiment;

import java.util.Scanner;

/*通过键盘输入一些整数，建立一个链表
这些数是你学号中依次取出的两位数。  再加上今天的时间。
	例如你的学号是 20172301
	今天时间是 2018/10/1， 16：23：49秒
数字就是
	20， 17，23，1， 20， 18，10，1，16，23，49
打印所有链表元素， 并输出元素的总数。
在你的程序中，请用一个特殊变量名来纪录元素的总数，变量名就是你的名字。 例如你叫 张三， 那么这个变量名就是
	int nZhangSan = 0;   //初始化为 0. */
public class FirstExperiment {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一些整数，这些整数是你学号中依次取出的两位数以及+\n\t+今天的时间（例如：2018/10/1,16:23:49就是数字20,17,23,1，16,23,49）");
        String sentence =scan.nextLine();
        int[] number = new int[100];
        String[] numbers = sentence.split(",");
        for(int a = 0;a<numbers.length;a++)
        {
            number[a] = Integer.parseInt(numbers[a]);
        }
        FirstLinkedlist Head = new FirstLinkedlist(number[0]);
        int nLixinyu = 1;
        for(int a=1; a < numbers.length;a++)
        {
            FirstLinkedlist node = new FirstLinkedlist(number[a]);
            InsertNode(Head,node);
            nLixinyu++;
        }
        //打印链表元素。
        System.out.println("链表元素是：");
        PrintLinkedlist(Head);
        System.out.println();
        System.out.println("元素总数为"+nLixinyu);

    }
    //链表的输出方法。
    public static void PrintLinkedlist(FirstLinkedlist Head) {
        FirstLinkedlist node = Head;//链表的头不能动。
        while (node != null) {
            System.out.print(" " + node.number);
            node = node.next;
        }
    }

    //头插法的方法。
    public static void InsertNode1(FirstLinkedlist Head, FirstLinkedlist node) {
        node.next = Head;
        Head = node;
        System.out.println("" + Head.number);
    }

    //尾插法的方法。
    public static void InsertNode(FirstLinkedlist Head, FirstLinkedlist node) {
        FirstLinkedlist temp = Head;
        //遍历链表，找到链表末尾。
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = node;
    }

    //链表的中间插入。
    public static void InsertNode(FirstLinkedlist Head, FirstLinkedlist node1, FirstLinkedlist node2) {
        FirstLinkedlist point = Head;
        while ((point.number != node1.number) & point != null) {
            point = point.next;
        }
        if (point.number == node1.number) {
            node1.next = point.next;
            point.next = node2;
        }
    }

    //链表的删除方法。
    public static void Deletenode(FirstLinkedlist Head, FirstLinkedlist node) {//这里的node要指向需要删除对象的前一个节点。
        FirstLinkedlist prenode = Head, currentnode = Head;
        while (prenode != null) {
            if (currentnode != node) {
                prenode = currentnode;
                currentnode = currentnode.next;
            } else {
                break;
            }
        }
        prenode.next = currentnode.next;
    }

    //链表的选择排序法。
    public static FirstLinkedlist selectionSort(FirstLinkedlist Head) {
        //记录每次循环的最小值
        int temp ;
        FirstLinkedlist curNode = Head;
        while (curNode != null) {
            /**
             * 内重循环从当前节点的下一个节点循环到尾节点，
             * 找到和外重循环的值比较最小的那个，然后与外重循环进行交换
             */
            FirstLinkedlist nextNode = curNode.next;
            while (nextNode != null) {
                //比外重循环的小值放到前面
                if (nextNode.number < curNode.number) {
                    temp = nextNode.number;
                    nextNode.number = curNode.number;
                    curNode.number = temp;
                }
                nextNode = nextNode.next;
            }
            curNode = curNode.next;
        }
        return Head;
    }
}
